package sys_ctrl

import (
	"net/http"
	"ubt-aio-service/app/mod/sys_mod"
	"ubt-aio-service/app/pkg/parse"
	"ubt-aio-service/app/serv/sys_serv"
	"ubt-aio-service/app/utils"
)

type sysDict struct{}

var SysDictCtrl sysDict

// Save 保存数据
func (c *sysDict) Save(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	req := &sys_mod.SysDictSaveReq{}
	// 将请求的参数转换为请求结构体
	if err := parse.Parse(r, req); err != "" {
		utils.ToJson(w, &utils.ResJson{Code: utils.ParamErr.Code, Msg: err})
		return
	}
	// 过滤关键参数值中的非法字符
	req.DictId = utils.InputFilter(req.DictId, true)
	req.DictName = utils.InputFilter(req.DictName, true)
	req.ShortName = utils.InputFilter(req.ShortName, true)
	req.FullName = utils.InputFilter(req.FullName, true)
	req.DictCode = utils.InputFilter(req.DictCode, true)
	req.TypeCode = utils.InputFilter(req.TypeCode, true)
	req.ParentId = utils.InputFilter(req.ParentId, true)
	req.LogoUrl = utils.InputFilter(req.LogoUrl, true)
	req.LogoId = utils.InputFilter(req.LogoId, true)
	req.LogoName = utils.InputFilter(req.LogoName, true)
	if req.DictId == req.ParentId {
		utils.ToJson(w, utils.ParentErr)
		return
	}
	// 判断编码是否存在
	extVo := &sys_mod.SysDictExtVo{DictId: req.DictId, DictCode: req.DictCode, Kind: req.Kind, TypeId: req.TypeId, ParentId: req.ParentId}
	if ext := sys_serv.SysDictServ.Exists(extVo); ext {
		utils.ToJson(w, utils.Exists)
		return
	}
	quanPin, jianPin := utils.GetPinyin(req.DictName)
	req.QuanPin = quanPin
	req.JianPin = jianPin
	var (
		res  *utils.ResJson
		kind uint8
	)
	if req.DictId == "" {
		// 新增
		req.OptUser = userInfo.UserId
		res = sys_serv.SysDictServ.Add(req)
		kind = 1
	} else {
		// 修改
		if req.Kind == 1 {
			// 如果删除的是分类，则将其下的数据也一并删除
			ch := make(chan int)
			// 开启线程进行处理
			typeReq := &sys_mod.SysDictTypeReq{TypeId: req.DictId, TypeCode: req.DictCode}
			go sys_serv.SysDictServ.UpdTypeCode(ch, typeReq)
			// 设定主线程等待，防止主线程结束，子线程被中断
			ch <- 1
		}
		res = sys_serv.SysDictServ.Update(req)
		kind = 3
	}
	if res.Code == utils.Succeed.Code {
		logReq := &sys_mod.SysLogSaveReq{UserId: userInfo.UserId, MenuCode: utils.SysDict, IpAddr: userInfo.ClientIp, Kind: kind}
		sys_serv.SysLogServ.Add(logReq)
	}
	utils.ToJson(w, res)
}

// Deletes 删除数据
func (c *sysDict) Deletes(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	req := &sys_mod.SysDictProReq{}
	// 将请求的参数转换为请求结构体
	if err := parse.Parse(r, req); err != "" {
		utils.ToJson(w, &utils.ResJson{Code: utils.ParamErr.Code, Msg: err})
		return
	}
	// 过滤关键参数值中的非法字符
	req.DictIds = utils.InputFilter(req.DictIds, true)
	if req.Kind == 1 {
		// 如果删除的是分类，则将其下的数据也一并删除
		ch := make(chan int)
		// 开启线程进行处理
		go sys_serv.SysDictServ.DelByType(ch, req.DictIds)
		// 设定主线程等待，防止主线程结束，子线程被中断
		ch <- 1
	}
	res := sys_serv.SysDictServ.Deletes(req)
	if res.Code == utils.Succeed.Code {
		logReq := &sys_mod.SysLogSaveReq{UserId: userInfo.UserId, MenuCode: utils.SysDict, IpAddr: userInfo.ClientIp, Kind: 2}
		sys_serv.SysLogServ.Add(logReq)
	}
	utils.ToJson(w, res)
}

// One 获取数据详情
func (c *sysDict) One(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	// 过滤关键参数值中的非法字符
	u := r.URL.Query()
	if u == nil {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	dictId := u.Get("dictId")
	dictId = utils.InputFilter(dictId, true)
	if dictId == "" || len(dictId) != 21 {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	res := sys_serv.SysDictServ.One(dictId)
	utils.ToJson(w, res)
}

// List 获取数据树状列表
func (c *sysDict) List(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	// 过滤关键参数值中的非法字符
	u := r.URL.Query()
	if u == nil {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	kinds := u.Get("kind")
	kinds = utils.InputFilter(kinds, true)
	typeCode := u.Get("typeCode")
	typeCode = utils.InputFilter(typeCode, true)
	kind := parse.Str2u8(kinds)
	if kind == 0 {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	req := &sys_mod.SysDictListReq{Kind: kind, TypeCode: typeCode, DataRole: userInfo.DataRole, OptDept: userInfo.DeptId}
	res := sys_serv.SysDictServ.List(req)
	utils.ToJson(w, res)
}

// Tree 获取数据树状列表
func (c *sysDict) Tree(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	// 过滤关键参数值中的非法字符
	u := r.URL.Query()
	if u == nil {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	kinds := u.Get("kind")
	kinds = utils.InputFilter(kinds, true)
	typeCode := u.Get("typeCode")
	typeCode = utils.InputFilter(typeCode, true)
	kind := parse.Str2u8(kinds)
	if kind == 0 {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	req := &sys_mod.SysDictListReq{Kind: kind, TypeCode: typeCode, DataRole: userInfo.DataRole, OptDept: userInfo.DeptId}
	res := sys_serv.SysDictServ.Tree(req)
	utils.ToJson(w, res)
}

// Sort 获取数据数量，用于排序
func (c *sysDict) Sort(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	// 过滤关键参数值中的非法字符
	u := r.URL.Query()
	if u == nil {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	kinds := u.Get("kind")
	kinds = utils.InputFilter(kinds, true)
	typeId := u.Get("typeId")
	typeId = utils.InputFilter(typeId, true)
	parentId := u.Get("parentId")
	parentId = utils.InputFilter(parentId, true)
	kind := parse.Str2u8(kinds)
	if kind == 0 || parentId == "" || len(parentId) != 21 {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	req := &sys_mod.SysDictSortReq{Kind: kind, TypeId: typeId, ParentId: parentId}
	res := sys_serv.SysDictServ.Sort(req)
	utils.ToJson(w, res)
}

// Select 选择数据
func (c *sysDict) Select(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	// 过滤关键参数值中的非法字符
	u := r.URL.Query()
	if u == nil {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	kinds := u.Get("kind")
	kinds = utils.InputFilter(kinds, true)
	typeCode := u.Get("typeCode")
	typeCode = utils.InputFilter(typeCode, true)
	keywords := u.Get("keywords")
	keywords = utils.InputFilter(keywords, true)
	kind := parse.Str2u8(kinds)
	if kind == 0 || typeCode == "" {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	req := &sys_mod.SysDictSelReq{Kind: kind, TypeCode: typeCode, Keywords: keywords, DataRole: userInfo.DataRole, OptDept: userInfo.DeptId, OptUser: userInfo.UserId}
	res := sys_serv.SysDictServ.Select(req)
	utils.ToJson(w, res)
}

// SelDepts 获取部门及用户数量数据树状列表
func (c *sysDict) SelDepts(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	// 过滤关键参数值中的非法字符
	u := r.URL.Query()
	if u == nil {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	typeCode := u.Get("typeCode")
	typeCode = utils.InputFilter(typeCode, true)
	if typeCode == "" {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	res := sys_serv.SysDictServ.SelDepts(typeCode)
	utils.ToJson(w, res)
}
